package services

import "github.com/sirupsen/logrus"

//213	weekSwitch	//	星期开关     1字节8个位，1~7位分别代表星期一到星期日
//214	cycleStartTime1	//	循环开启时间1   小时（1字节）
//215		//	循环开启时间1   分钟（1字节）
//216	cycleEndTime1	//	循环关闭时间1   小时（1字节）
//217		//	循环关闭时间1   分钟（1字节）
//218	duration1	//	开启时长1    小时（1字节）
//219		//	开启时长1    分钟（1字节）
//220		//	开启时长1    秒（1字节）
//221	interval1	//	间隔时长1    小时（1字节）
//222		//	间隔时长1    分钟（1字节）
//223		//	间隔时长1    秒（1字节）
//224	pumpMode1	//	风扇模式1    0 正常  1动感模式  2 跟随外界
//225	pumpSpeed1	//	风扇速度1   0~100%
//226	scheduledStartTime1	//	定时开启时间1   小时（1字节）
//227		//	定时开启时间1   分钟（1字节）
//228	scheduledDuration1	//	定时开启时长1    分钟（1字节）
//229		//	定时开启时长1    秒（1字节）
//230	scheduledStartTime2	//	定时开启时间2   小时（1字节）
//231		//	定时开启时间2  分钟（1字节）
//232	scheduledDuration2	//	定时开启时长2    分钟（1字节）
//233		//	定时开启时长2    秒（1字节）
//234	weekSwitch2	//	星期开关     1字节8个位，1~7位分别代表星期一到星期日
//235	pumpSpare1	//	 水泵备用1
//236	pumpSpare2	//	 水泵备用2
//237	pumpSpare3	//	 水泵备用3
//238	pumpSpare4	//	 水泵备用4
//239	pumpSpare5	//	 水泵备用5
//240	pumpSpare6	//	 水泵备用6
//241	pumpSpare7	//	 水泵备用7

// 定义水泵控制参数的映射表
var PumpCtrlTParamsMap = map[string]DataRule{
	"weekSwitch":          {StartAddr: 213, Length: 1},
	"cycleStartTime1":     {StartAddr: 214, Length: 2}, // 包括小时和分钟
	"cycleEndTime1":       {StartAddr: 216, Length: 2}, // 包括小时和分钟
	"duration1":           {StartAddr: 218, Length: 3}, // 包括小时、分钟和秒
	"interval1":           {StartAddr: 221, Length: 3}, // 包括小时、分钟和秒
	"pumpMode1":           {StartAddr: 224, Length: 1},
	"pumpSpeed1":          {StartAddr: 225, Length: 1},
	"scheduledStartTime1": {StartAddr: 226, Length: 2}, // 包括小时和分钟
	"scheduledDuration1":  {StartAddr: 228, Length: 2}, // 包括分钟和秒
	"scheduledStartTime2": {StartAddr: 230, Length: 2}, // 包括小时和分钟
	"scheduledDuration2":  {StartAddr: 232, Length: 2}, // 包括分钟和秒
	"weekSwitch2":         {StartAddr: 234, Length: 1},
	"pumpSpare1":          {StartAddr: 235, Length: 1},
	"pumpSpare2":          {StartAddr: 236, Length: 1},
	"pumpSpare3":          {StartAddr: 237, Length: 1},
	"pumpSpare4":          {StartAddr: 238, Length: 1},
	"pumpSpare5":          {StartAddr: 239, Length: 1},
	"pumpSpare6":          {StartAddr: 240, Length: 1},
	"pumpSpare7":          {StartAddr: 241, Length: 1},
}

// 定义水泵控制参数的结构体
type PumpCtrlTParams struct {
	WeekSwitch          uint8  `json:"weekSwitch"`
	CycleStartTime1     string `json:"cycleStartTime1"`
	CycleEndTime1       string `json:"cycleEndTime1"`
	Duration1           string `json:"duration1"`
	Interval1           string `json:"interval1"`
	PumpMode1           uint8  `json:"pumpMode1"`
	PumpSpeed1          uint8  `json:"pumpSpeed1"`
	ScheduledStartTime1 string `json:"scheduledStartTime1"`
	ScheduledDuration1  string `json:"scheduledDuration1"`
	ScheduledStartTime2 string `json:"scheduledStartTime2"`
	ScheduledDuration2  string `json:"scheduledDuration2"`
	WeekSwitch2         uint8  `json:"weekSwitch2"`
	PumpSpare1          uint8  `json:"pumpSpare1"`
	PumpSpare2          uint8  `json:"pumpSpare2"`
	PumpSpare3          uint8  `json:"pumpSpare3"`
	PumpSpare4          uint8  `json:"pumpSpare4"`
	PumpSpare5          uint8  `json:"pumpSpare5"`
	PumpSpare6          uint8  `json:"pumpSpare6"`
	PumpSpare7          uint8  `json:"pumpSpare7"`
}

// 组装并发送命令给设备的函数
func AssemblePumpCtrlTPayload(mac string, method string, params map[string]interface{}) error {
	var byteList []ByteData
	// 按 startAddr 对参数进行排序
	for k, v := range params {
		logrus.Infof("Key: %s, Value: %v", k, v)
		if dataRule, ok := PumpCtrlTParamsMap[k]; ok {
			byteList = append(byteList, ByteData{
				StartAddr: dataRule.StartAddr,
				Length:    dataRule.Length,
				Value:     v,
			})
		}
	}
	logrus.Info("Unsorted byteList:", byteList)
	err := AssembleCommandPayloadByByteData(mac, method, byteList)
	return err
}
